package cn.itcast.user.controller;

import cn.itcast.user.UserService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    //  服务发现, 直接定义url的方式叫直连，但是没任何的使用价值，仅仅是参考价值。
    //  使用zookeeper作为注册中心(不需要配置url属性)
    //  url = "dubbo://127.0.0.1:20880"
    //  check=false: 消费者在启动时不进行检查。
    //  cache="lru": 配置结果缓存(lru, threadlocal, jcache)
    //  methods: 指定具体方法加结果缓存
    //  @Reference(check = false, cache = "lru",
    //             methods = {@Method(name = "hello", cache = "lru")})
    //  cluster: 指定集群容错模式(failover, failfast, failsafe, failback, forking)
    // loadbalance: 指定负载均衡策略(random, roundrobin, leastactive)
    // version = "2.0": 指定调用服务提供的版本号
    @Reference(check = false,version = "2.0",
               timeout = 1000, retries=2, cluster = "failover",
               loadbalance = "roundrobin")
    private UserService userService;

    @GetMapping("/hello")
    @HystrixCommand(fallbackMethod = "fallback")
    public String hello(String name){
        // 发起远程调用(RPC)
        return userService.hello(name);
    }

    /** 服务降级方法 */
    public String fallback(String name){
        return name + ": 服务器正忙，请稍候再试。。。";
    }
}